#!/usr/bin/env python
# -*- coding:utf8 -*-
"""
存放用户视图层
"""
from interface import user_interface
from interface import bank_interface
from interface import shop_interface
from lib import common

# 全局变量，记录用户是否已登录
login_user = None


# 1.注册功能
def register():
    while 1:
        username = input("请输入用户名:").strip()
        password = input("请输入密码:").strip()
        re_password = input("请确认密码:").strip()
        # 可以输入自定义的金额

        # 小的逻辑处理：比如两次密码是否一致
        if password == re_password:
            # 2) 调用接口层的注册接口，将用户名和密码交给接口层来进行处理

            # res ---> (False, '用户名已存在！')
            # res = user_interface.register_interface(
            # flag, msg ----> (False, '用户名已存在！')
            # （True，注册成功)，(False,注册失败)
            flag, msg = user_interface.register_interface(
                username, password
            )

            # 3) 根据flag判断用户注册是否成功，用于控制break
            if flag:
                print(msg)
                break
            else:
                print(msg)


# 2.登录功能
def login():
    while 1:
        # 1)让用户输入用户名和密码：
        username = input("请输入用户名:").strip()
        password = input("请输入密码:").strip()
        # 2)调用接口层，将数据传给登录接口
        flag, msg = user_interface.login_interface(
            username, password
        )

        if flag:
            print(msg)
            global login_user
            login_user = username
            break
        else:
            print(msg)


# 3.查看余额
@common.login_auth
def check_balance():
    # 1.直接调用查看余额接口,获取用户余额
    balance = user_interface.check_bal_interface(
        login_user
    )
    print(f"用户{login_user} 账户余额为:{balance}")


# 4.提现功能
@common.login_auth
def withdraw():
    while 1:
        input_money = input("请输入提现金额：").strip()
        if not input_money.isdecimal():
            print("请重新输入")
            continue

        input_money = int(input_money)
        flag, msg = bank_interface.withdraw_interface(
            login_user, input_money
        )
        if flag:
            print(msg)
            break
        else:
            print(msg)


# 5.还款功能
@common.login_auth
def repay():
    while 1:
        # 1)让用户输入还款金额
        input_money = input("请输入还款金额：").strip()
        # 2)判断用户输入的是否是数字
        if not input_money.isdecimal():
            print("请输入正确的金额")
            continue
        input_money = int(input_money)

        # 3)判断用户输入的金额大于0
        if input_money > 0:
            # 4)调用还款接口
            flag, msg = bank_interface.repay_interface(
                login_user, input_money
            )
            if flag:
                print(msg)
                break
        else:
            print("输入的额度不能小于零")


# 6.转账功能
@common.login_auth
def transfer():
    """
    1.接收用户输入的 转账金额
    2.接收用户输入的 转账目标用户
    :return:
    """
    while True:
        # 1.用户输入转账目标用户与金额
        to_user = input('请输入转账目标用户：').strip()
        money = input('请输入转账金额：').strip()

        # 2.判断用户输入的金额是否是数字或 >0
        if not money.isdecimal():
            print("请输入正确的金额！")
            continue

        money = int(money)

        if money > 0:
            # 3) 调用转账接口
            flag, msg = bank_interface.transfer_interface(
                login_user, to_user, money
            )
            if flag:
                print(msg)
                break
            else:
                print(msg)

        else:
            print('请输入正确的金额！')


# 7.查看流水
@common.login_auth
def check_flow():
    # 直接调用查看流水接口
    flow_list = bank_interface.check_flow_interface(
        login_user
    )
    if flow_list:
        for flow in flow_list:
            print(flow)
    else:
        print("当前没有流水！")
    pass


# 8.购物功能
@common.login_auth
def shopping():
    # 1.创建商品列表
    shop_list = [
        ['上海灌汤包', 30],
        ['杭州小笼包', 20],
        ['贵州茅台', 9000],
        ['山东包子', 15],
        ['东北包子', 20],
        ['满汉全席', 100000],
        ['皇家礼炮', 20000],
    ]

    # 初始化当前购物车
    shopping_car = {}  # {"商品名称":['单价','数量']}

    while 1:
        # 1. 打印商品信息，让用户选择
        print("欢迎来到oldboy商城".center(40, "-"))
        for index, shop in enumerate(shop_list):
            shop_name, shop_price = shop
            print(f'商品编号：[{index}]',
                  f'商品名称：[{shop_name}]',
                  f'商品价格：[{shop_price}]'
                  )
        print("end".center(50, "-"))
        # 2.让用户根据商品编号进行选择
        choice = input('请输入商品编号 (是否结账输入 y or n)：').strip()

        # 2.1 输入的是 y 进入支付结算功能
        if choice == 'y':
            if not shopping_car:
                print('购物车是空的，不能支付，请重新输入！')
                continue
            # 6.调用支付接口进行支付
            flag, msg = shop_interface.shopping_interface(login_user, shopping_car)
            if flag:
                print(msg)
                break
            else:
                print(msg)

        # 2.2 输入的是 n 添加购物车
        elif choice == 'n':
            # 判断当前用户是否添加过购物车
            if not shopping_car:
                print('购物车是空的，不能添加，请重新输入！')
                continue
            # 7.调用添加购物车接口
            flag, msg = shop_interface.add_shop_car_interface(
                login_user, shopping_car
            )
            if flag:
                print(msg)
                break
        print(len(shop_list))
        if not choice.isdigit() or int(choice) not in range(len(shop_list)):
            print("请输入正确的编号")
            continue

        choice = int(choice)

        # 4.获取商品名称和单价
        shop_name, shop_price = shop_list[choice]

        # 5.加入购物车
        # 5.1 判断用户选择的商品是否重复，重复则数量 +1
        if shop_name in shopping_car:
            # 添加商品
            shopping_car[shop_name][1] += 1

        else:
            # 否则数量默认为1
            shopping_car[shop_name] = [shop_price, 1]

        print("当前购物车：", shopping_car)


# 9.查看购物车
@common.login_auth
def check_shop_car():
    # 直接调用查看购物车功能
    shop_car = shop_interface.check_shop_car_interface(
        login_user
    )
    print(shop_car)


@common.login_auth
# 10.管理员功能
def admin():
    from core import admin
    admin.admin_run()


# 创建函数功能字典
func_dic = {
    '1': register,
    '2': login,
    '3': check_balance,
    '4': withdraw,
    '5': repay,
    '6': transfer,
    '7': check_flow,
    '8': shopping,
    '9': check_shop_car,
    '10': admin,
}


# 视图层主程序
def run():
    while True:
        print("""
         ------ Oldboy Bank -------
           1. 注册功能
           2. 登录功能
           3. 查看余额
           4. 提现功能
           5. 还款功能
           6. 转账功能
           7. 查看流水
           8. 购物功能
           9. 查看购物车
           10. 管理员功能
         --------  end  ---------
        """)
        choice = input("请输入功能编号：").strip()
        if choice not in func_dic:
            print("请输入正确的编号")
            continue
        func_dic.get(choice)()  # func_dic.get("1")() --> register()
